﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Xml.Linq;

namespace WebSite
{
    public class Global : System.Web.HttpApplication
    {
        private static bool IsFirstRequest = true;
        private static Object LockObject = new Object();

        System.Threading.Thread EmailSender;

        protected void Application_Start(object sender, EventArgs e)
        {
            //Cargar de la base de datos el URL actual de la aplicacion del Boletin
            using (BLL.DataContextClassesBoletin.DataClassesDataContext DB = new BLL.DataContextClassesBoletin.DataClassesDataContext())
            {
                ConfigurationSettings.AppSettings["URLBoletin"] = (from c in DB.Configuraciones
                                                                   where c.NombreConfiguracion == "absoluteurl"
                                                                   select c.ValorConfiguracion).First().ToString();
            }

            //Cargar de la base de datos el parametro de TiempoDeVidaVacante
            //Utilizar este metodo con la Base de datos remota
            //using (BLL.DataContextClassesBoletin.DataClassesDataContext DB = new BLL.DataContextClassesBoletin.DataClassesDataContext())
            //{
            //    ConfigurationSettings.AppSettings["TiempoDeVidaVacante"] = (from c in DB.Configuraciones
            //                                                                where c.NombreConfiguracion == "TiempoDeVidaVacante"
            //                                                                select c.ValorConfiguracion).First().ToString();
            //}

            //Cargar de la base de datos el parametro de TiempoDeVidaVacante
            //Utilizar este metodo con la Base de datos local
            using (BLL.DataContextClasses.DataClassesDataContext DB = new BLL.DataContextClasses.DataClassesDataContext())
            {
                ConfigurationSettings.AppSettings["TiempoDeVidaVacante"] = (from c in DB.Configuraciones
                                                                            where c.Nombre == "TiempoDeVidaVacante"
                                                                            select c.Valor).First().ToString();
            }

            //HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
            //ConfigurationSettings.AppSettings["URLBoletin"].ToString();            
            //System.AppDomain.CurrentDomain.BaseDirectory.ToString();
            //HttpContext.Current.Request.ApplicationPath;
            //HttpContext.Current.Request.MapPath(appPath);
            //HttpContext.Current.Request.ServerVariables["APPL_PHYSICAL_PATH"]
            //HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
            //HttpContext.Current.Request.ServerVariables["PATH_TRANSLATED"]
            //HttpContext.Current.Request.ServerVariables["PATH_INFO"]
            //HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"]
            //HttpContext.Current.Request.ServerVariables["SERVER_NAME"]

            this.EmailSender = new System.Threading.Thread(this.SendAutomaticEmails);
            this.EmailSender.Start();

        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            //Escribir en la base de datos el URL actual de la aplicacion
            //Utilizar este metodo con la Base de datos remota
            //if (Global.IsFirstRequest)
            //{
            //    lock (LockObject)
            //    {
            //        if (Global.IsFirstRequest)
            //        {
            //            using (BLL.DataContextClassesBoletin.DataClassesDataContext DB = new BLL.DataContextClassesBoletin.DataClassesDataContext())
            //            {
            //                BLL.DataContextClassesBoletin.Configuracione ConfigUpdate = (from c in DB.Configuraciones
            //                                                                             where c.NombreConfiguracion == "ApplicationURL"
            //                                                                             select c).First();

            //                string g = HttpRuntime.AppDomainAppVirtualPath;

            //                ConfigUpdate.ValorConfiguracion = "http://" + HttpContext.Current.Request.ServerVariables["HTTP_HOST"].ToString() + "/";
            //                DB.SubmitChanges();
            //            }
            //            Global.IsFirstRequest = false;
            //        }
            //        else return;
            //    }
            //}
            //else return;

            //Escribir en la base de datos el URL actual de la aplicacion
            //Utilizar este metodo con la Base de datos local
            if (Global.IsFirstRequest)
            {
                lock (LockObject)
                {
                    if (Global.IsFirstRequest)
                    {
                        using (BLL.DataContextClasses.DataClassesDataContext DB = new BLL.DataContextClasses.DataClassesDataContext())
                        {
                            BLL.DataContextClasses.Configuracione ConfigUpdate = (from c in DB.Configuraciones
                                                                                  where c.Nombre == "ApplicationURL"
                                                                                  select c).First();

                            ConfigUpdate.Valor = "http://" + HttpContext.Current.Request.ServerVariables["HTTP_HOST"].ToString() + "/";
                            DB.SubmitChanges();
                        }
                    }
                    else return;
                }
            }
            else return;
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }
        protected void Application_Error(object sender, EventArgs e)
        {

        }
        protected void Session_End(object sender, EventArgs e)
        {

        }
        protected void Application_End(object sender, EventArgs e)
        {
            this.EmailSender.Abort();
        }


        protected void SendAutomaticEmails()
        {
            while (true)
            {
                if (Convert.ToInt32(DateTime.Now.DayOfWeek) == Convert.ToInt32(ConfigurationManager.AppSettings["DiaEnvioEncuesta"]) &&
                    DateTime.Now.Hour == Convert.ToInt32(ConfigurationManager.AppSettings["HoraEnvioEncuesta"]) &&
                    DateTime.Now.Minute == Convert.ToInt32(ConfigurationManager.AppSettings["MinutosEnvioEncuesta"]))
                {        
                    using (BLL.DataContextClasses.DataClassesDataContext DB = new BLL.DataContextClasses.DataClassesDataContext())
                    {
                        var DocumentsToEgresados = from d in DB.TipoDocumentos
                                                   where d.Destinatario.Trim().ToLower() == "egresados"
                                                   where d.Periodicidad != null && d.FechaInicio != null
                                                   select d;                        

                        var DocumentsToEstudiantes = from d in DB.TipoDocumentos
                                                     where d.Destinatario.Trim().ToLower() == "estudiantes"
                                                     where d.Periodicidad != null && d.FechaInicio != null
                                                     select d;

                        var DocumentsToEmpresas = from d in DB.TipoDocumentos
                                                  where d.Destinatario.Trim().ToLower() == "empresas"
                                                  where d.Periodicidad != null && d.FechaInicio != null
                                                  select d;

                        List<string> EgresadosRecipients = (from c in DB.Contactos
                                                            where c.TipoUsuario.Trim().ToLower() == "egresado"
                                                            where c.ID_TipoContacto == BLL.BusinessClasses.Contacto.GetIDByTipoContactoDescripcion("Email")
                                                            select c.Contacto1).ToList();

                        List<string> EstudiantesRecipients = (from c in DB.Contactos
                                                              where c.TipoUsuario.Trim().ToLower() == "estudiante"
                                                              where c.ID_TipoContacto == BLL.BusinessClasses.Contacto.GetIDByTipoContactoDescripcion("Email")
                                                              select c.Contacto1).ToList();

                        List<string> EmpresasRecipients = (from c in DB.Contactos
                                                           where c.TipoUsuario.Trim().ToLower() == "empresa"
                                                           where c.ID_TipoContacto == BLL.BusinessClasses.Contacto.GetIDByTipoContactoDescripcion("Email")
                                                           select c.Contacto1).ToList();

                        foreach (BLL.DataContextClasses.TipoDocumento item in DocumentsToEgresados)
                        {
                            if (item.FechaInicio.HasValue && 
                                item.FechaInicio.Value <= DateTime.Now &&
                                item.Periodicidad.HasValue && 
                                ((DateTime.Now.Subtract(item.FechaInicio.Value).Days / 7) % item.Periodicidad.Value) == 0) 
                            {
                                BLL.BusinessClasses.Email.SendMail(EgresadosRecipients, null, item.Descripcion, item.Contenido);                                
                            }
                        }                        

                        foreach (BLL.DataContextClasses.TipoDocumento item in DocumentsToEstudiantes)
                        {
                            if (item.FechaInicio.HasValue && 
                                item.FechaInicio.Value <= DateTime.Now &&
                                item.Periodicidad.HasValue && 
                                ((DateTime.Now.Subtract(item.FechaInicio.Value).Days / 7) % item.Periodicidad.Value) == 0)
                            {
                                BLL.BusinessClasses.Email.SendMail(EstudiantesRecipients, null, item.Descripcion, item.Contenido);
                            }
                        }

                        foreach (BLL.DataContextClasses.TipoDocumento item in DocumentsToEmpresas)
                        {
                            if (item.FechaInicio.HasValue && 
                                item.FechaInicio.Value <= DateTime.Now &&
                                item.Periodicidad.HasValue && 
                                ((DateTime.Now.Subtract(item.FechaInicio.Value).Days / 7) % item.Periodicidad.Value) == 0)
                            {
                                BLL.BusinessClasses.Email.SendMail(EmpresasRecipients, null, item.Descripcion, item.Contenido);
                            }
                        }
                    }
                }
            }
        }
    }
}